package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import Clases.Receta;
import Clases.RecetaCombo;
import Clases.RecetaSimple;

public class DAOReceta
{
	private static DAOReceta pool;
	
	private DAOReceta(){
	}	
	
	public static DAOReceta getInstancia()
	{
		if (pool == null)
			pool = new DAOReceta();
		return pool;
	}
	
	@SuppressWarnings("static-access")
	public Receta buscarReceta (String nombre)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * from [TPOAPI].[dbo].[Receta] where nombre = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,nombre);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				if(TipoReceta(result.getInt("idReceta"))){
					RecetaCombo rc = new RecetaCombo();
					rc.setNombre(result.getString("Nombre"));
					rc.setComplejidad(result.getString("Complejidad"));
					rc.setModoDePreparacion(result.getString("ModoDePreparacion"));
					rc.setTiempoDeCoccion(result.getString("TiempoDeCoccion"));
					rc.setIdReceta(result.getInt("idReceta"));
					//Lleno el vector que contiene la receta combo de las recetas simples o combo!
					rc.setRecetas(DAOReceta.getInstancia().buscarComboSimple(rc.getIdReceta()));
					return rc;
				} else {
					RecetaSimple rs = new RecetaSimple();
					rs.setNombre(result.getString("nombre"));
					rs.setComplejidad(result.getString("complejidad"));
					rs.setModoDePreparacion(result.getString("modoDePreparacion"));
					rs.setTiempoDeCoccion(result.getString("tiempoDeCoccion"));
					rs.setIdReceta(result.getInt("idReceta"));
					rs.setIngredientes(DAOIngrediente.getInstancia().buscarIngRec(rs.getIdReceta()));
					return rs;
				}
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return null;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return null;
	}
	
	@SuppressWarnings("static-access")
	public Vector<Receta> buscarTodasRecetas()
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();	
		Vector<Receta> vec = new Vector<Receta>();
		Receta r = null;
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * from [TPOAPI].[dbo].[Receta]" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while(result.next())
			{
				if(TipoReceta(result.getInt("idReceta"))){
					r = new RecetaCombo();
					r.setNombre(result.getString("nombre"));
					r.setComplejidad(result.getString("complejidad"));
					r.setModoDePreparacion(result.getString("modoDePreparacion"));
					r.setTiempoDeCoccion(result.getString("tiempoDeCoccion"));
					r.setIdReceta(result.getInt("idReceta"));
					vec.add(r);
				} else {
					r = new RecetaSimple();
					r.setNombre(result.getString("nombre"));
					r.setComplejidad(result.getString("complejidad"));
					r.setModoDePreparacion(result.getString("modoDePreparacion"));
					r.setTiempoDeCoccion(result.getString("tiempoDeCoccion"));
					r.setIdReceta(result.getInt("idReceta"));
					vec.add(r);
				}
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return vec;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return vec;
	}	
	
	public String obtenerNombreReceta (int idReceta)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String s = "";
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT Nombre from [TPOAPI].[dbo].[Receta] where idReceta = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,idReceta);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				s = result.getString("Nombre");
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return s;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return s;
	}
	
	public boolean TipoReceta (int idReceta)

	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * from [TPOAPI].[dbo].[ComboReceta] where idRecetaCombo = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, idReceta);
			ResultSet result = ps.executeQuery();
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return result.next();
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return false;
	}	

	@SuppressWarnings("static-access")
	public Vector<RecetaSimple> buscarComboSimple (int idReceta)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Vector<RecetaSimple> vec = new Vector<RecetaSimple>();

		try
		{
			String senten = "SELECT DISTINCT * from [TPOAPI].[dbo].[ComboReceta] CR  join [TPOAPI].[dbo].[Receta] R on R.idReceta = CR.idRecetaSimple where CR.idRecetaCombo = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,idReceta);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				if(TipoReceta(result.getInt("idReceta"))){
					RecetaCombo rc = new RecetaCombo();
					rc.setNombre(result.getString("Nombre"));
					rc.setComplejidad(result.getString("Complejidad"));
					rc.setModoDePreparacion(result.getString("ModoDePreparacion"));
					rc.setTiempoDeCoccion(result.getString("TiempoDeCoccion"));
					rc.setIdReceta(result.getInt("idReceta"));
					//Lleno el vector que contiene la receta combo de las recetas simples!
					rc.setRecetas(DAOReceta.getInstancia().buscarComboSimple(rc.getIdReceta()));
					for(int i=0;i<rc.getRecetas().size();i++){
						vec.add(rc.getRecetas().elementAt(i));
					}
				} else {
					RecetaSimple rs = new RecetaSimple();
					rs.setNombre(result.getString("nombre"));
					rs.setComplejidad(result.getString("complejidad"));
					rs.setModoDePreparacion(result.getString("modoDePreparacion"));
					rs.setTiempoDeCoccion(result.getString("tiempoDeCoccion"));
					rs.setIdReceta(result.getInt("idReceta"));
					rs.setIngredientes(DAOIngrediente.getInstancia().buscarIngRec(rs.getIdReceta()));
					vec.add(rs);
				}
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return vec;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return vec;
	}

	public Receta buscarReceta (int idReceta)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * from [TPOAPI].[dbo].[Receta] where idReceta = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,idReceta);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				if(TipoReceta(result.getInt("idReceta"))){
					RecetaCombo rc = new RecetaCombo();
					rc.setNombre(result.getString("Nombre"));
					rc.setComplejidad(result.getString("Complejidad"));
					rc.setModoDePreparacion(result.getString("ModoDePreparacion"));
					rc.setTiempoDeCoccion(result.getString("TiempoDeCoccion"));
					rc.setIdReceta(result.getInt("idReceta"));
					//Lleno el vector que contiene la receta combo de las recetas simples!
					rc.setRecetas(DAOReceta.getInstancia().buscarComboSimple(rc.getIdReceta()));
					return rc;
				} else {
					RecetaSimple rs = new RecetaSimple();
					rs.setNombre(result.getString("nombre"));
					rs.setComplejidad(result.getString("complejidad"));
					rs.setModoDePreparacion(result.getString("modoDePreparacion"));
					rs.setTiempoDeCoccion(result.getString("tiempoDeCoccion"));
					rs.setIdReceta(result.getInt("idReceta"));
					rs.setIngredientes(DAOIngrediente.getInstancia().buscarIngRec(rs.getIdReceta()));
					return rs;
				}
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return null;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return null;
	}


	
}
